#include <common.h>
#include <print.h>
#include <irq.h>
#include <8259A.h>
#include <task.h>
#include <app.h>
#include <page.h>
#include <memory.h>
#include <mutex.h>
#include <event.h>
#include <keyboard.h>
#include <share.h>


typedef void (*APP_INIT)(void);
APP_INIT AppInit = (APP_INIT)APP_START_ADDR; // APP_START_ADDR = 0x80000: APP 加载地址
#define KERNEL_HEAP_ADDR    0x70000
#define KERNEL_HEAP_LEN     0x10000


S32 main(void)
{
    asm volatile("cli");                        // 关中断
    SYS_SetCursorPos(0, 2);                     // 设置光标位置: (0, 2)
    SetFontColor(E_FONT_WHITE);                 // 设置打印字体颜色: 白色
    printk("Start kernel...\n");                // 打印字符串 "Start kernel..."
    printk("Mem:%x\n", *((U32*)MEM_SIZE_ADDR)); // 打印物理内存容量
    printk("Hard disk:%d\n", *((U08*)0x475));   // BIOS 会将硬盘数量值存储到 0x475 地址处
    IrqInit();                                  // 中断请求初始化，绑定默认中断服务程序
    pic_init();                                 // 初始化可编程中断控制器 8259A - 级联
    MemInit((U08 *)KERNEL_HEAP_ADDR, KERNEL_HEAP_LEN);  // 内核堆初始化
    MutexInit();                                // 初始化互斥锁
    EventInit();                                // 初始化事件
    KeyboardInit();                             // 键盘初始化

    AppInit();                                  // 应用程序模块初始化
    TaskInit();                                 // 任务初始化，初始化任务相关队列并插入任务节点
    ClearKernelPageWR();                        // 清内核页表项 WR 位，使得（3 特权级）无法修改内核所在的内存页

    asm volatile("sti");                        // 开中断
    TaskStart();                                // 启动任务

    while(1);
    return 0;
}
